// ts 中的接口  interface
// 对批量方法传入参数进行约束
// 接口：行为和动作的规范， 对批量方法进行约束 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

// interface FullName {
//   // 约束
//   firstname: string;
//   secondName: string;
//   // secondName?: string;  可选参数 加？
// }

// function printName(name: FullName): string {
//   return name.firstname + ' ' + name.secondName;
// }

// const params = {
//   firstname: 'jiang',
//   secondName: 'zi peng',
//   age: 12
// };

// console.log(printName(params)); // 比传 firstname  secondName

// 函数类型接口： 对方法传入的参数 以及返回值进行约束

// 加密的函数类型接口    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

// interface encrypt {
//   (key: string, value: string): string;
// }

// const func1: encrypt = function (key: string, val: string): string {
//   return key + ':' + val;
// };

// console.log(func1('name', 'jiang'));

// 可索引接口： 数组，对象的约束（不常用）

// 数组的约束         >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

// interface useArr {
//   [index: number]: string | number;
// }

// const arr: useArr = ['zs', 'li', 12];
// console.log(arr[0]);

// 对象的约束  >>>>>>>>>>>>>>

// interface useObj {
//   [index: string]: string | number;
// }

// const obj: useObj = {
//   name: 'zs',
//   age: 12
// };

// console.log(obj);

// 类类型接口 ：对类的约束  和  抽象类有点相识

// interface Animal {
//   name: string;
//   eats(str: string): void;
// }

// class Dog1 implements Animal {
//   public name: string;
//   constructor(na: string) {
//     this.name = na;
//   }

//   eats(): string {
//     return this.name + '吃雪特';
//   }
// }

// const dog1 = new Dog1('DOGs');

// console.log(dog1.eats());

// 接口扩展  接口继承接口

interface Animal {
  eat(str: string): void;
}

interface Person extends Animal {
  work(str: string): void;
}

class Web implements Person {
  public name: string;
  constructor(na: string) {
    this.name = na;
  }

  eat(val: string): string {
    return this.name + '爱吃' + val;
  }

  work(val: string): string {
    return this.name + '喜欢' + val;
  }
}

const w = new Web('阿姜');
console.log(w.work('敲代码'));
console.log(w.eat('辣椒11'));
